/*
按时间增加一个维度：时间戳，每次删除都有一个唯一的时间戳t，其他没有删除的数的时间戳可任意指定，为方便后面树状数组的处理，每次删除将时间戳倒序处理，
对于元素i，求出删除i之前，即 ti之前，满足i<j,a[i]>a[j]或 i>j,a[i]<a[j]的对数，
即对于ti<tj，求出i<j,a[i]>a[j]或 i>j,a[i]<a[j]的对数即可，故需要两遍cdq分治，
另外，里面双指针的位置等信息需要考虑一下
*/
#define quickread
#ifdef quickread
#include <cstdio> 
template <typename T>
inline void read(T& x)
{
    int c=getchar(), f=1; x=0;
    while(c<'0'||'9'<c) {if(c=='-') f=-1; c=getchar();}
    while('0'<=c&&c<='9') 
        x=(x<<3)+(x<<1)+c-'0', c=getchar();
    x*=f;
}
template <typename T>
inline void quickwrite(T x)
{
    if(x<0) putchar('-'), x*=-1;
    if(x>=10) quickwrite(x/10);
    putchar(x%10+'0');
}
#else 
#include <iostream>
#endif
#include <algorithm>
#include <cstring>
using namespace std;
#define DEBUG
using ll=long long;
const int N=100010;
int n, m;
struct Data
{
    int a, t, res; //权值 时间戳(删除顺序倒序编号) 逆序对
}q[N], w[N];
int tree[N]; //已经处理过的元素的时间戳
int pos[N];
ll ans[N];

int lowbit(int x)
{
    return x&-x;
}

void add(int x, int v) //在树状数组的位置x上加上值v，通过不断加上lowbit(i)来更新相关位置
{
    for(int i=x; i<N; i+=lowbit(i)) tree[i]+=v;
}

int query(int x) //查询树状数组中位置x的前缀和，通过不断减去lowbit(i)来累加相关位置的值
{
    int res=0;
    for(int i=x; i; i-=lowbit(i)) res+=tree[i];
    return res;
}

void merge_sort(int l, int r)
{
    if(l>=r) return;
    int mid=l+r>>1;
    merge_sort(l, mid); merge_sort(mid+1, r);

    int i=mid, j=r; //逆序对情况1 i<j a[i]>a[j]
    ll sum=0;
    while(i>=l&&j>mid) //从大到小比较
        if(q[i].a>q[j].a) add(q[i].t, 1), i--; //逆序对 
        else q[j].res+=query(q[j].t-1), j--; //所有比当前时间戳小的时间戳的个数(每个时间戳对应一个元素)
    while(j>mid) q[j].res+=query(q[j].t-1), j--;
    for(int k=i+1; k<=mid; k++) add(q[k].t, -1);

    j=l, i=mid+1; //顺序对情况2 i>j a[i]<a[j]
    while(j<=mid&&i<=r) //从小到大比较
        if(q[i].a<q[j].a) add(q[i].t, 1), i++;
        else q[j].res+=query(q[j].t-1), j++;
    while(j<=mid) q[j].res+=query(q[j].t-1), j++;
    for(int k=mid+1; k<i; k++) add(q[k].t, -1);


    i=l, j=mid+1;
    int k=0;
    while(i<=mid&&j<=r)
        if(q[i].a<=q[j].a) w[k++]=q[i++]; //按照权值排序 保持分治结构
        else w[k++]=q[j++];
    while(i<=mid) w[k++]=q[i++];
    while(j<=r) w[k++]=q[j++];

    for(int i=l, j=0; j<k; i++, j++) q[i]=w[j];
}

void init()
{
    read(n), read(m);
    for(int i=0; i<n; i++)
    {
        read(q[i].a);
        pos[q[i].a]=i;
    }

    for(int i=0, j=n; i<m; i++)
    {
        int a; read(a);
        q[pos[a]].t=j--;
        pos[a]=-1; //已删除
    }

    for(int i=1, j=n-m; i<=n; i++) //未删除元素
        if(pos[i]!=-1) q[pos[i]].t=j--;
}

void solve()
{
    init(); 
    merge_sort(0, n-1);

    for(int i=0; i<n; i++) ans[q[i].t]=q[i].res;
    for(int i=2; i<=n; i++) ans[i]+=ans[i-1];
    for(int i=0, j=n; i<m; i++, j--) quickwrite(ans[j]), puts("");
}

// #undef DEBUG
signed main()
{
    #ifdef DEBUG
        freopen("./in.txt", "r", stdin);
        freopen("./out.txt", "w", stdout);
    #endif
    #ifndef quickread
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    #endif

    int T=1; //scanf("%d", &T);
    while(T--) 
    {
        solve();
    }
    return 0;
}
